<?php

namespace GMantuWeChat;

require_once ('mysqlidb.php');


/**
 * @desc    数据库表格定义，支持属性配置
 * @desc    表格字段为: table_name
 * @desc    属性字段为: table_prop, 表格创建后通过alter更新
 * @note    属性有如下配置: primary -- 主键  index -- 索引  uniq_key -- 不能相同的列
 *
 * @note    primary_key字段必须配置，其他字段非必须
 *
 */
$tables = Array (
    
    /****************         用户表           ********************/
    
     /**
     * @note user_info table: 保存用户基础信息，以及自定义信息
     * @date 2016-02-17 20:30
     * @author leafan
     */
    'user_info' => Array(
        'table_name' => Array(
            'account' => 'varchar(128) not null',   // 登陆账号，默认为微信的 unionid(如有)，或是openid, 是主键
            'wechat_id' => 'varchar(128)',          // 对应微信的unionid(如有), 如果无，则是 openid,当前暂时只用openid
            'password' => 'char(64)',               // 密码的md5值
            'create_time' => 'datetime',            // 创建用户的时间. 如果是微信用户，则第一次访问此站的时间
            'invalid' => 'int unsigned',            // 0 表示正常，其他值为异常，0为默认值
            'privilege' => 'char(32)',              // 权限，比如VIP啥的。可以用位来区分
            'last_visit' => 'datetime',             // 最近一次访问时间
            'visit_times' => 'bigint',              // 是指点击微信公众号某一个 按钮/跳转 的次数（不是指访问页面的次数）
            'real_name' => 'varchar(64)',           // 真实姓名
            'phone' => 'varchar(20)',               // 电话号码
            'email' => 'varchar(64)',               // 电子邮箱
            'description' => 'varchar(512)',        // 个人描述
            'displayname' => 'varchar(128)'         // 昵称，默认为空。只显示微信的昵称; 微信昵称优先级高与本名称
        ),
        
        // 属性配置
        'table_prop' => Array(
            'primary_key' => 'account',             // 主键
            'index' => Array('wechat_id')          // 加快查询速度，增加索引
            //'uniq_key' => Array('real_name')        // 不能重复
        )
    ),
    
    
    /**
      * @note wechat_user table: 保存微信关注的用户信息，均为微信上获取
      * @date 2016-02-17 20:00
      * @author leafan
      */
    'user_wechat' => Array (
        'table_name' => Array(
            // 用户微信返回的信息
            'openid' => 'varchar(128) not null',    // primary key 用户的标识，对当前公众号唯一
            'subscribe' => 'bool default 0',        // 用户是否订阅该公众号标识，值为0时，代表此用户没有关注
            'nickname' => 'char(128)',              // 用户的昵称
            'sex' => 'int unsigned',                // 用户的性别，值为1时是男性，值为2时是女性，值为0时是未知
            'city' => 'varchar(16)',                // 用户所在城市
            'country' => 'varchar(16)',             // 用户所在国家
            'province' => 'varchar(16)',            // 用户所在省份
            'language' => 'varchar(16)',            // 用户的语言，简体中文为zh_CN
            'headimgurl' => 'varchar(1024)',        // 用户头像，最后一个数值代表正方形头像大小（0代表640*640正方形头像）
            'subscribe_time' => 'datetime',         // 最后一次关注时间        
            'unionid' => 'varchar(128)',            // 只有在用户将公众号绑定到微信开放平台帐号后，才会出现该字段
            'remark' => 'varchar(128)',             // 公众号运营者对粉丝的备注
            'groupid' => 'char(16)',                // 用户所在的分组ID
            'privilege' => 'varchar(256)'           // 被坑了，当通过网页授权时，还会多一个priviledge字段
        ),
        
        'table_prop' => Array(
            'primary_key' => 'openid',              // 主键 为openid
            'index' => Array('unionid')             // 根据union查询
        )
    ),
    
   
    /*
     * @note user_extrainfo table: 保存用户额外的个人信息和资料，比如公司名称等
     * @date 2016-02-17 21:30
     * @author leafan
     */
    'user_extrainfo' => Array(
        'table_name' => Array(
            'account' => 'varchar(128) not null',   // 登陆账号，默认为微信的openid, 是主键
            'industry' => 'varchar(64)',            // 所处行业
            'company' => 'varchar(128)',            // 公司名称
            'qqnumber' => 'varchar(16)',            // QQ号
            'birthday' => 'datetime',               // 生日号码
            'blogaddr' => 'varchar(128)',           // blog地址
            'rcvaddress' => 'varchar(512)'          // 收货地址
            // ... to be added ...
        ),
        
        'table_prop' => Array(
            'primary_key' => 'account'              // 主键 为account
        )
    ),
     
    /*
     * @note user_configure table: 保存用户的个人设置
     * @date 2016-02-17 21:40
     * @author leafan
     */
    'user_configure' => Array(
        'table_name' => Array(
            'config_id' => 'INT UNSIGNED NOT NULL AUTO_INCREMENT',  // 主键
            'account' => 'varchar(128) not null',   // 登陆账号，默认为微信的openid, 是主键
            'block_remind' => 'int unsigned',       // 0表示不block，非0表示不回复
            'email_remind' => 'int unsigned'        // 0表示不提醒，非0表示提醒
            // ... to be added ...
        ),
        
        'table_prop' => Array(
            'primary_key' => 'config_id',           // 主键 为account
            'index' => Array('account')             // 加快索引
        )
    ),
    
    
    
    
    
    /****************         事件表           ********************/
    
    /**
     * @note remind_info table: 用来保存某一个提醒事件，只是基础信息
     * @note trigger_time说明：这个目的是: 一个事件可以提醒多次，每一次都是一个独立事件
     *
     * @note 为了编码以及使用的简单，禁止同一时间(精度是秒)设置2个事件。要处理直接修改此primary id即可(性能会下降)
     * @note 如果是生日，则需要每年生成一条记录写入
     *
     * @date 2016-02-17 21:51
     * @author leafan
     */
    'remind_info' => Array(
        'table_name' => Array(
            'remind_id' => 'INT UNSIGNED NOT NULL AUTO_INCREMENT',  // 主键，还是修改成自增。因为多人可以同一天生日
            'account' => 'varchar(128) not null',   // 登陆账号
            'remind_time' => 'datetime',            // 配置的事件时间，此字段暂时不用
            'remind_year' => 'INT UNSIGNED',        // 提醒的年份
            'remind_month' => 'INT UNSIGNED',       // 提醒的月份
            'remind_day' => 'INT UNSIGNED',         // 提醒的天
            'add_time' => 'datetime',               // 增加节日的时间
            'recycle' => 'varchar(32)',             // 循环方式, 按月(month)、按年(year)、只提醒一次(once)
            'date_format' => 'INT UNSIGNED',        // 0表示公历，也是默认值，非0表示农历
            'remind_title' => 'varchar(64) not null',       // 事件名称，不允许为空
            'remind_desc' => 'varchar(512)'         // 事件描述
        ),
        
        'table_prop' => Array(
            'primary_key' => 'remind_id',           // 主键 为remind_id
            'index' => Array('account', 'remind_time') 
        )
    ),
    
    /**
     * @note remind_event table: 用来保存某一个提醒事件，是一个具体的提醒事件
     * @note 每次取出来某个事件的所有提醒，需要通过id匹对
     * @noie 对于每月或每年的提醒，由其他程序主动在每天自动执行时生成事件
     * @date 2016-02-17 23:10
     * @author leafan
     */
    'remind_event' => Array(
        'table_name' => Array(
            'event_id' => 'INT UNSIGNED NOT NULL AUTO_INCREMENT',  // 主键
            'remind_id' => 'varchar(192) not null', // 以用户登录账号和事件触发的时间组成字符串作为 id，某一个事件
            'trigger_time' => 'datetime',           // 事件触发时间
            'ahead_seconds' => 'int unsigned',      // 提前多久提醒，单位是秒，理论上来说，与remind_time-trigger_time相等
            'email_way' => 'int unsigned',          // 是否需要邮件提醒，默认为0，表示不提醒
            'wechat_way' => 'int unsigned'          // 是否需要微信提醒，默认为1，表示需要提醒 (当前不读取此字段值)
        ),
        
        'table_prop' => Array(
            'primary_key' => 'event_id',            // 主键 为 event_id
            'index' => Array('remind_id', 'trigger_time')
        )
    ),
    
    
    
    
    /****************         日志表           ********************/
    
    /**
     * @note log_message table: 用来保存接收的消息日志，包括文本、媒体、位置、链接等消息
     * @note 不包括点击、关注等事件消息。此类消息请关注 log_event table
     * @note 字段基本与微信文档一致
     * @date 2016-02-17 23:10
     * @author leafan
     */
    'log_message' => Array(
        'table_name' => Array(
            'message_id' => 'INT UNSIGNED NOT NULL AUTO_INCREMENT',  // 主键
            
            // 微信字段，基础字段
            'fromusername' => 'varchar(128) not null',  // 发送方帐号（一个OpenID）
            'tousername' => 'varchar(128)',             // 开发者微信号，应该都是一样的，暂时留着
            'msgtype' => 'varchar(32)',                 // 消息类型，image/text 等
            'msgid' => 'bigint',                        // 消息id，64位整型
            'createtime' => 'bigint',                   // 	消息创建时间(整型)。表格不额外保存一份服务器插入时间了，以此时间为准
            
            // 文本消息
            'content' => 'varchar(50000)',              // 消息正文
            
            // 图片/媒体 消息
            'picurl' => 'varchar(1024)',                // 图片链接
            'mediaid' => 'varchar(256)',                // 图片消息媒体id，可以调用多媒体文件下载接口拉取数据
            'format'=> 'varchar(32)',                   // 语音格式，如amr，speex等
            'thumbmediaid' => 'varchar(256)',           // 视频消息缩略图的媒体id，可以调用多媒体文件下载接口拉取数据
            
            // 地址消息
            'location_x' => 'double(10, 6)',            // 地理位置纬度
            'location_y' => 'double(10, 6)',            // 地理位置经度
            'scale' => 'int signed',                    // 地图缩放大小
            'label' => 'varchar(256)',                  // 地理位置信息
            
            // 链接消息
            'title' => 'varchar(256)',                  // 消息标题
            'description' => 'varchar(512)',            // 消息描述
            'url' => 'varchar(1024)'                    // 消息链接
        ),
        
        'table_prop' => Array(
            'primary_key' => 'message_id',            // 主键 为 event_id
            'index' => Array('fromusername', 'createtime')
        )
    ),
    
    /**
     * @note log_event table: 用来保存触发事件的日志，比如点击按钮、关注公众号等
     * @note 字段基本与微信文档一致
     * @date 2016-02-17 23:10
     * @author leafan
     */
    'log_event' => Array(
        'table_name' => Array(
            'message_id' => 'INT UNSIGNED NOT NULL AUTO_INCREMENT',  // 主键
            
            // 微信字段，基础字段
            'fromusername' => 'varchar(128) not null',  // 发送方帐号（一个OpenID）
            'tousername' => 'varchar(128)',         // 开发者微信号，应该都是一样的，暂时留着
            'msgtype' => 'varchar(32)',             // 消息类型，一般都是 event 
            'createtime' => 'bigint',               // 消息创建时间(整型)。表格不额外保存一份服务器插入时间了，以此时间为准
            'event' => 'varchar(32)',               // 	事件类型，subscribe(订阅)、SCAN(扫描) 等
            
            // 二维码扫描、自定义菜单等事件
            'eventkey' => 'varchar(256)',           // 事件KEY值，qrscene_为前缀，后面为二维码的参数值
            'ticket' => 'varchar(10240)',           // 二维码的ticket，可用来换取二维码图片
            'menuid' => 'varchar(32)',              // 新增，menuid
            
            // 地理位置信息
            'latitude' => 'double(10, 6)',          // 地理位置纬度
            'longitude' => 'double(10, 6)',         // 地理位置经度
            '`precision`' => 'double(10, 6)'        // 地理位置精度 precision是关键字, 因此加上 ` 字符
        ),
        
        'table_prop' => Array(
            'primary_key' => 'message_id',          // 主键
            'index' => Array('fromusername', 'createtime', 'eventkey')
        )
    )
    
    // to be added.. 
    
    
);


?>